import { computed, ref } from 'vue'
import { equals, isNil, map } from 'ramda'
function columnsToHttpColumns(columns: Array<F.TableColumns>) {
	return map((item) => {
		const show = item.required || isNil(item.show) ? true : item.show
		const res: F.Column = {
			show,
			required: item.required || false,
			title: item.label ?? item.title ?? '',
			key: item.key || '',
			fixed: item.fixed,
		}
		if (item.children) {
			res.children = columnsToHttpColumns(item.children)
		}
		return res
	}, columns)
}
/**
 * 根据  key 去拿到保存的自定义字段
 * @param arg
 * @returns
 */
export function useCustomTable() {
	const visible = ref(false)
	const keyRef = ref<string>()
	const columns = ref<F.Column[]>([]) // todo 需要接口存取
	const propsColumns = ref<F.TableColumns[]>([]) //
	const tableColumns = computed(() => {
		return columnFilter(propsColumns.value, columns.value)
	})
	function initColumns(col: Array<F.TableColumns>, key?: string) {
		propsColumns.value = col
		if (key) {
			keyRef.value = key
		}
		if (keyRef.value) {
			try {
				const res = localStorage.getItem(keyRef.value)
				if (res) {
					columns.value = JSON.parse(res)
					return
				}
			} catch (error) {
				saveColumns(columnsToHttpColumns(col))
				return
			}
		}
		columns.value = columnsToHttpColumns(col)
	}
	// todo 合并表头的没有做过滤 后续如遇到 需要添加 目前 children 存在问题的
	function columnFilter(filterColumns: Array<F.TableColumns>, columns: F.Column[]): Array<F.TableColumns> {
		const list: Array<F.TableColumns> = []
		columns.forEach((item) => {
			const data = filterColumns.find((res) => equals(res.key, item.key))
			if (data && item.show) {
				list.push({
					...data,
				})
			}
		})
		return list
	}
	function toggle(ok?: boolean) {
		visible.value = equals(typeof ok, 'boolean') ? !!ok : !visible.value
	}
	function saveColumns(updateColumns: F.Column[]) {
		if (keyRef.value) {
			localStorage.setItem(keyRef.value, JSON.stringify(updateColumns))
		}
		columns.value = updateColumns
	}
	return {
		visible,
		toggle,
		initColumns,
		saveColumns,
		tableColumns,
		columns,
	}
}
